查看原文
其他

Visual Effect Graph示例项目

Unity Unity官方平台 2022-05-07

Visual Effect Graph能够帮助我们创作新一代视觉效果,它使用了基于节点的工作流程和在GPU运行的计算着色器。


我们在《使用Visual Effect Graph创作惊艳的视觉效果》中介绍过该工具的使用。自从在Unite LA 2018发布Visual Effect Graph预览版以来,我们一直在向项目中添加许多VFX示例


这些示例展示了Visual Effect Graph可以处理的不同制作条件,包括从简单的粒子系统到带有特定行为较为复杂的系统。现在你可以下载及查看这些示例,并使用它们来创作属于你的视觉特效。


下载示例项目

请确保使用Unity 2018.3,版本越新,运行效果越好。建议使用Unity Hub来获取最新版本。Visual Effect Graph示例项目可运行于Windows和Mac系统的编辑器。


请访问Visual Effect Graph项目页,获取源代码Zip压缩包或Tar.gz压缩包:

https://github.com/Unity-Technologies/VisualEffectGraph-Samples/releases


示例项目结构

所有示例都位于Assets/Samples目录下。主场景位于/Assets根目录,在构建播放器时使用,主场景用于按顺序加载Build Settings窗口中场景构建列表所指定的所有示例。

 

 

如果需要构建播放器,请确保在构建设置的索引0处加入VisualEffectsSamples场景,然后添加其它要处理的场景。


示例项目

示例1:Unity Cube

Unity Cube示例是使用早期版本Visual Effect Graph制作的第一批效果之一。它展示了一个由40万个粒子组成的系统,其中有一个移动的发射源吸引着粒子朝着Unity体积立方体移动。

 

 

发射球体和运动过程在整个效果中是独立的,我们使用了每条轴的sin(Time)值来改变球体的位置。这项计算的有趣之处在于我们可以确定子帧位置,以减少球体位置的离散化。

 

我们可以开启和关闭选项来查看二个模式的区别。在下面示例中,当仅使用时间的时候,球体的移动速度非常快,我们会看到球体形状在空间中离散化。然而,当使用Per-Particle总体时间的时候,这种瑕疵会完全消失。

 

 

一旦粒子被球体释放出来,粒子会受到二个向量场作用:一个是朝着Unity立方体的吸引场;另一个是在被吸引时丰富运动效果的噪声场。粒子也会和发射球体相互碰撞。

 

粒子的颜色由二个梯度控制:一个用于处理运动中发射球体附近的粒子,周期为5秒;另一个梯度是蓝色变粉色的标准生命周期颜色。

 

通过使用这种遮罩技巧,我们模拟发射源对附近粒子应用的伪光照效果。



示例2:Morphing Face

Morphing Face变形的脸示例展示了,使用点缓存来设置粒子初始位置,同时保存法线等其它属性的功能。



粒子会从我们使用Houdini烘焙的点缓存随机生成,但我们也可以使用点缓存烘焙工具从Unity网格生成该点缓存,该工具可通过依次点击Window/Visual Effects/Utilities/Point Cache Bake Tool打开。

 

 

点缓存文件会导入Unity,根据属性生成带有一个纹理的资源。我们可以使用Point Cache节点来引用该资源,它将填充所有属性图,并连接每个属性。


然后我们可以把这些内容加到Attribute from Map块来获取这些数值。在示例中,我们从点缓存随机采样了多个点来创建粒子。

 

 

一旦创建,这些粒子不会在模拟效果中更新,粒子会固定在空间中,不会变化或消失。我们会在输出的Context环境计算随时间变化的遮罩,在上图中显示为绿色和红色。

 

这种遮罩可以让我们控制粒子的许多参数,使它们从二个状态混合:小型非金属立方体和较长的金属棒。朝向也会混合在对齐的立方体和随机方向的棒状物之间。

 

场景还使用了移动光线来显示材质变化,同时改变遮罩效果。


示例3:Butterflies

Butterflies蝴蝶示例是使用多项输出来渲染一个粒子的示例。在该示例中,我们模拟了围绕中心垂直轴旋转的一群蝴蝶。



每个蝴蝶都由一个粒子元素定义,仅在更新的Context环境模拟它的轨迹。在下面的示例中,蝴蝶粒子由红点突出显示。

 

翅膀和身体的动画会在3个不同的输出Context环境中计算,其中二个用于翅膀,一个用于身体。为了确定蝴蝶的方向,我们使用向前的(速度)向量和朝后倾斜的上向量,使蝴蝶身体不和轨迹对齐,而是使头部相对腹部向上偏移。

 

身体的动画使用正弦函数处理,正弦函数使用因蝴蝶而异的随机频率。翅膀角度也使用相同频率的正弦函数处理,但是会在时间上稍微偏移,以模拟出身体的阻力和惯性效果。



示例4:Grass Wind

Grass Wind草和风示例展示和常见粒子完全不同的模拟效果,即地形中草的效果。我们使用从地形数据生成的点缓存在地形生成草场,它带有由地形法线和世界空间上向量混合的朝上向量。

 

 

每个元素通过使用Position,Radius和Velocity参数实现与玩家交互,这些参数会被发送到效果中,并基于玩家的角色数值进行处理。

 

模拟效果由以下规则控制:

  • 玩家范围内的植物会朝玩家的移动方向弯曲。

  • 已经弯曲的植物不会受到影响,因此踩在这些植物上面不会影响它们的效果。

  • 随着时间推移,植物会重新恢复原始方向。

 

为了模拟作物弯曲的效果,我们把数值保存到未使用的Velocity和Alpha属性中。

  • Velocity速度属性保存作物的弯曲方向。

  • Alpha属性保存弯曲状态:Alpha值为1.0表示作物的直立状态;0.0表示作物完全弯曲;最小值-2.0和0.0的状态相同,用于使作物有额外的弯曲时间。

 


踩在作物上时,Alpha属性值会以特定速度减小,直到数值达到最小值-2.0。没有踩在作物上时,作物会以特定速度增大,直到数值为1.0。当从0.0过渡1.0时,速度值会释放并减小,直到作物恢复直立状态。

 

对于没有受到踩踏和弯曲的作物,我们在输出应用了额外的风噪声,使它们闲置时不完全处于静止状态。


示例5:Volumetric

Volumetric体积示例比较简单,但它展示了与高清晰渲染管线和体积雾的集成效果。场景设置为分割环境,其背景天空是纯灰色。场景中使用了二个光源,一个为橙色,另一个为蓝色。



为了投射阴影,每个光源都由一个朝着摄像机的聚光灯组成,并开启了实时阴影效果。为了模拟准确的光源,我们为每个光源在相反方向配置了另一个聚光灯。


不透明粒子会从动态光源生成,它带有Flipbook纹理,会在每个粒子模拟出多个元素,这有助于我们保持较大的质量,同时不必使用六倍的粒子数量。


粒子质量使用噪声来变化,粒子会被吸引到摄像机附近的位置。粒子在渲染时启用了投射阴影,并使用漫反射配置文件和透光率,使光线会透过粒子。


下图是我们为示例使用的光照效果详解过程。



示例6:Portal

我们希望通过CG工具来仿制效果,并添加自己的改进。制作Portal示例,我们从RiseFX的Houdini作品得到了一些启发。

  

 

该效果包含一个粒子系统,一个内部扭曲圆圈和8个线形光组成的光照控件,它们都会在运行模式中进行旋转。

 

 

粒子在生成时会分成二个分组:快速旋转的圆环效果和碰撞粒子,所有粒子都会在地面发生碰撞。



示例7:AR Radar

AR雷达示例由许多系统协作实现的复杂效果,它同时具有内部序列和外部序列,外部序列通过使用范围在0到1的浮点参数Initialize来组成时间轴效果。

  

 

Initialize参数会在整个视图中多次使用,以控制初始化到网格时的部署效果。


通过图形多次使用此参数,以在初始化网格时控制部署效果:

  • 从0.0到0.1时:它控制闪光点

  • 从0.1到1.0时:网格和环境进行部署。

 


敌人飞船会在基本效果部署后触发,使用的是Timeline VFX Dedicated轨道。该轨道会多次发送一个事件,从而生成敌人飞船。

 

中心的闪光点由Position Parameter Binder脚本控制,该脚本会使闪光点关联到场景的点光源。


 

下图是分离效果。



示例8:Voxelized Terrain

VoxelizedTerrain体素地形是由粒子控制的高度场模拟效果,这些粒子都被渲染为立方体。


每个粒子都是大小为256×256的2D网格上的点,粒子会基于对象空间坐标从2D纹理采样。坐标可以进行偏移和缩放,使地形发生缩放和平移。


 

通过采样高度图并保存数值到Scale.y,我们可以改变所有点的效果,从而设置实际的采样Height高度,根据高度对立方体进行着色,然后调整它们的材质属性,例如:水面的光滑度。

  

 

我们可以调整水位,输入高度和最终高度。所有参数都是公开的,受到全局脚本VoxelizedTerrainController.cs控制。

 

 

该脚本会处理鼠标和键盘的事件,从而平移,缩放和旋转摄像机,并对Visual Effect组件设置所有参数。

 

该脚本使用了实用的ExposedParameter结构,它会缓存参数的字符串值,并从Shader.PropertyToID()返回整型索引。

dist = Mathf.Clamp(dist, CameraMinMaxDistance.x, CameraMinMaxDistance.y);


           ViewingCamera.transform.position = CameraRoot.transform.position + dist * dir;


           VisualEffect.SetVector2(Position, m_Position);

           VisualEffect.SetVector2(WorldSize, m_WorldSize);


           //  滑块

           float inputHeightMapScale = Mathf.Lerp(InputHeightLevel.x, InputHeightLevel.y, InputHeightMapScaleSlider.value);


           float elevation = Mathf.Lerp(ElevationRange.x, ElevationRange.y, ElevationSlider.value);


           float waterElevation = Mathf.Lerp(WaterElevationRange.x, WaterElevationRange.y, WaterElevationSlider.value);


           CameraRoot.transform.position = new Vector3(CameraRoot.transform.position.x, waterElevation, CameraRoot.transform.position.z);


           ViewingCamera.transform.LookAt(CameraRoot.transform);


           VisualEffect.SetFloat(InputHeightMapScale, inputHeightMapScale);

           VisualEffect.SetFloat(Elevation, elevation);

           VisualEffect.SetFloat(WaterElevation, waterElevation);


示例9:Genie

Genie精灵效果由许多系统组成,这些系统使用了一些相同的参数,通过使用内部序列来互相连接。该示例使用了一个简单的脚本来控制效果的打开和关闭,只需单击神灯即可。

 

 

该场景包含四个点,用于定义贝塞尔点,使魔力从神灯中流出。为了使粒子运动,我们没有使用速度值,而是使用了一个位置,它会在粒子的生命周期沿着贝塞尔移动,以及由向量场噪声计算的偏移。


贝塞尔曲线的最后一个点保存着精灵的位置,它会在视觉效果中使用3D正弦波动画生成。该点控制了精灵身体和眼睛的位置。

 

 

场景的设置使用了单个Timeline,以及控制精灵前后移动的控制组件。通过使用VFX Event Tracks,我们控制粒子生成的开始和停止。


此外,Timeline控制了Cinemachine摄像机的混合效果和简单的控制组件。


更多视觉效果和示例

所有新示例都将在Visual Effect Graph资源包(5.x.x-preview)的Unity 2019.1发布周期推出。


这意味着现在的所有示例都属于新发布周期的一部分,但我们不再会对Unity 2018.3的示例进行更新。请持续关注,第一时间获取我们为Unity 2019.1发布的新示例。更多视觉效果即将推出,敬请期待。


更多Unity最新功能介绍,尽在Unity Connect平台(Connect.unity.com)。


推荐阅读


官方活动

Unity GDC 2019 活动日程

3月18-22日GDC 2019将在旧金山举行,了解Unity活动日程信息,请点击此处

Unity GDC 2019官网:

https://unity.com/gdc-2019


Unite Shanghai 2019(早鸟票优惠,最后2天)

5月10日-12日上海,Unite大会强势回归。技术门票正在热销中,购票即获指定Asset Store资源商店精品21款资源的5折优惠券。

购票请访问:Unite2019.csdn.net


点击“阅读原文”获取示例项目

↓↓↓ 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存